<?php
/**
 * Session 类用于表示 HTTP 会话，提供类似于 Java Servlet 中 HttpSession 的功能。
 */
class Session {
    /**
     * @var array $data 存储会话数据的数组。
     */
    private array $data = [];

    /**
     * 启动或恢复会话。
     */
    public function __construct() {
        // 启动或恢复会话
        if (session_status() == PHP_SESSION_NONE) {
            // 如果会话未启动，启动会话
            session_start();
        }
        // 将 session 数据赋值给类属性
        $this->data = $_SESSION ?? [];
    }

    /**
     * 设置会话中的属性。
     *
     * @param string $name 会话属性的名称。
     * @param mixed $value 会话属性的值。
     */
    public function setAttribute(string $name, $value): void {
        $this->data[$name] = $value;
        $_SESSION = $this->data; // 更新 $_SESSION 数据
    }

    /**
     * 获取会话中的属性。
     *
     * @param string $name 会话属性的名称。
     *
     * @return mixed|null 会话属性的值，如果属性不存在则返回 null。
     */
    public function getAttribute(string $name){
        return $this->data[$name] ?? null;
    }

    /**
     * 移除会话中的属性。
     *
     * @param string $name 要移除的会话属性的名称。
     */
    public function removeAttribute(string $name): void {
        unset($this->data[$name]);
        unset($_SESSION[$name]); // 更新 $_SESSION 数据
    }

    /**
     * 获取会话 ID。
     *
     * @return string 会话 ID。
     */
    public function getSessionId(): string {
        return session_id();
    }

    /**
     * 注销会话。
     */
    public function invalidate(): void {
        // 销毁所有会话数据
        session_unset();
        // 销毁会话文件
        session_destroy();
        // 关闭会话
        session_write_close();
    }
}